home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / [_a_3d_rac1854832192005.psc / cls2dTexture.cls < prev    next >
Text File  |  2005-02-19  |  7KB  |  212 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cls2dTexture"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. Private colKey As Long
  17. Private UseTransMap As Boolean
  18. Private MipLevels As Long
  19. Private eolOffset As Long
  20. Private LockRect As D3DLOCKED_RECT
  21. Private TexDesc As D3DSURFACE_DESC
  22. Private pTexture As Direct3DTexture8
  23. Private pData() As StoreTexLevel
  24.  
  25. Private Type StoreTexLevel
  26.     TexData() As Byte
  27. End Type
  28.  
  29.  
  30.  
  31. Private Sub Class_Initialize()
  32.     gEngine.RegisterObject Me, OBJ_2DTEXTURE
  33. End Sub
  34.  
  35. Private Sub Class_Terminate()
  36.     Cleanup
  37.     gEngine.UnregisterObject Me
  38. End Sub
  39.  
  40. '//-----------------------------------------------------------------------------
  41. '// Function: Cleanup
  42. '// Desc: Terminates the class.
  43. '//-----------------------------------------------------------------------------
  44. Public Sub Cleanup()
  45.     EditEnd
  46.     Set pTexture = Nothing
  47. End Sub
  48.  
  49. '//-----------------------------------------------------------------------------
  50. '// Function: LoadFromFile
  51. '// Desc: Loads a bitmap from a bmp file into the texture.
  52. '// Param: File (path of the bitmap file), ColorKey (transparent color),
  53. '// MipLevels (how many mip mapping levels should be created, pass 0 to create
  54. '// a complete mip map automatically), EnableEdit (if the texture should be
  55. '// enabled to perform per texel editing, only possible if MipLevels = 1)
  56. '// Return: succeeded or not.
  57. '//-----------------------------------------------------------------------------
  58. Public Function LoadFromFile(ByVal File As String, ByVal ColorKey As Long, Optional ByVal nMipLevels As Long = 1, Optional ByVal EnableEdit As Boolean = False) As Boolean
  59.     On Local Error GoTo Failed
  60.     Cleanup
  61.     Set pTexture = TextureMake(File, ColorKey, nMipLevels, EnableEdit)
  62.     pTexture.GetLevelDesc 0, TexDesc
  63.     colKey = ColorKey
  64.     MipLevels = nMipLevels
  65.     UseTransMap = False
  66.     LoadFromFile = True
  67. Failed:
  68. End Function
  69.  
  70. '//-----------------------------------------------------------------------------
  71. '// Function: LoadForEdit
  72. '// Desc: Creates an empty texture for per texel editing.
  73. '// Param: x (width of texture), y (height of texture)
  74. '// Note: x and y should both be a power of 2 (2 ^ n)
  75. '//-----------------------------------------------------------------------------
  76. Public Function LoadForEdit(ByVal x As Long, ByVal y As Long) As Boolean
  77.     On Local Error GoTo Failed
  78.     Cleanup
  79.     Set pTexture = gD3DX.CreateTexture(gD3DDevice, x, y, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED)
  80.     pTexture.GetLevelDesc 0, TexDesc
  81.     colKey = 0
  82.     MipLevels = 1
  83.     UseTransMap = False
  84.     LoadForEdit = True
  85. Failed:
  86. End Function
  87.  
  88. '//-----------------------------------------------------------------------------
  89. '// Function: EditStart
  90. '// Desc: Must be called at the beginning of a per texel editing operation.
  91. '//-----------------------------------------------------------------------------
  92. Public Function EditStart() As Boolean
  93.     On Local Error GoTo Failed
  94.     If Not MipLevels = 1 Or Not LockRect.pBits = 0 Then Exit Function
  95.     'check pixel format (D3DFMT_A8R8G8B8 required)
  96.     If Not TexDesc.Format = D3DFMT_A8R8G8B8 Then Exit Function
  97.     'Lock entire texture
  98.     LockRect.pBits = 0
  99.     pTexture.LockRect 0, LockRect, ByVal 0, 0
  100.     'Compute offset
  101.     eolOffset = LockRect.Pitch - TexDesc.Width * 4
  102.     EditStart = True
  103. Failed:
  104. End Function
  105.  
  106. '//-----------------------------------------------------------------------------
  107. '// Function: Edit
  108. '// Desc: Manipulates a single texel on the texture.
  109. '// Param: Pos (the x and y position on the texture, ranging from [0, 0] to
  110. '// [x - 1, y - 1]), a (the transparency value), r, g, b (the color values).
  111. '// Pass -1 to leave a value unchanged.
  112. '//-----------------------------------------------------------------------------
  113. Public Sub Edit(Pos As D3DVECTOR2, ByVal a As Long, ByVal r As Long, ByVal g As Long, ByVal b As Long)
  114.     On Local Error GoTo Failed
  115.  
  116.     Dim pTexData As Long, Data As Byte
  117.  
  118.     If LockRect.pBits = 0 Then Exit Sub
  119.     If Pos.x < 0 Or Pos.y < 0 Or Pos.x >= TexDesc.Width Or Pos.y >= TexDesc.Height Then Exit Sub
  120.     pTexData = LockRect.pBits + Pos.y * LockRect.Pitch + Pos.x * 4
  121.     '1. byte: blue
  122.     If Not b = -1 Then
  123.         Data = b
  124.         CopyMemory ByVal pTexData, Data, 1
  125.     End If
  126.     pTexData = pTexData + 1
  127.     '2. Byte: green
  128.     If Not g = -1 Then
  129.         Data = g
  130.         CopyMemory ByVal pTexData, Data, 1
  131.     End If
  132.     pTexData = pTexData + 1
  133.     '3. Byte: red
  134.     If Not r = -1 Then
  135.         Data = r
  136.         CopyMemory ByVal pTexData, Data, 1
  137.     End If
  138.     pTexData = pTexData + 1
  139.     '4. Byte: alpha
  140.     If Not a = -1 Then
  141.         Data = a
  142.         UseTransMap = True
  143.         CopyMemory ByVal pTexData, Data, 1
  144.     End If
  145. Failed:
  146. End Sub
  147.  
  148. '//-----------------------------------------------------------------------------
  149. '// Function: EditEnd
  150. '// Desc: Must be called at the end of a per texel editing operation.
  151. '//-----------------------------------------------------------------------------
  152. Public Sub EditEnd()
  153.     On Local Error Resume Next
  154.     If pTexture Is Nothing Then Exit Sub
  155.     pTexture.UnlockRect 0
  156.     LockRect.pBits = 0
  157. End Sub
  158.  
  159.  
  160. Friend Property Get getColKey() As Long
  161.     getColKey = colKey
  162. End Property
  163.  
  164. Friend Property Get getpTexture() As Direct3DTexture8
  165.     Set getpTexture = pTexture
  166. End Property
  167.  
  168. Friend Property Get getUseTransMap() As Boolean
  169.     getUseTransMap = UseTransMap
  170. End Property
  171.  
  172. Public Sub StoreData()
  173.     On Local Error GoTo Failed
  174.     
  175.     Dim i As Long, MipMapCnt As Long
  176.     Dim MipMapDesc As D3DSURFACE_DESC
  177.     Dim LRect As D3DLOCKED_RECT
  178.  
  179.     MipMapCnt = pTexture.GetLevelCount
  180.     EditEnd
  181.     ReDim pData(MipMapCnt - 1)
  182.     For i = 0 To MipMapCnt - 1
  183.         'Save texture in system memory.
  184.         pTexture.GetLevelDesc i, MipMapDesc
  185.         ReDim pData(i).TexData(MipMapDesc.Size - 1)
  186.         pTexture.LockRect i, LRect, ByVal 0, D3DLOCK_READONLY
  187.         CopyMemory pData(i).TexData(0), ByVal LRect.pBits, MipMapDesc.Size
  188.         pTexture.UnlockRect i
  189.     Next i
  190. Failed:
  191. End Sub
  192.  
  193. Public Sub ReStoreData()
  194.     On Local Error GoTo Failed
  195.     
  196.     Dim i As Long, MipMapCnt As Long
  197.     Dim MipMapDesc As D3DSURFACE_DESC
  198.     Dim LRect As D3DLOCKED_RECT
  199.  
  200.     Set pTexture = gD3DX.CreateTexture(gD3DDevice, TexDesc.Width, TexDesc.Height, MipLevels, 0, TexDesc.Format, D3DPOOL_MANAGED)
  201.     MipMapCnt = pTexture.GetLevelCount
  202.     'Restore texture from system memory.
  203.     For i = 0 To MipMapCnt - 1
  204.         pTexture.GetLevelDesc i, MipMapDesc
  205.         pTexture.LockRect i, LRect, ByVal 0, 0
  206.         CopyMemory ByVal LRect.pBits, pData(i).TexData(0), MipMapDesc.Size
  207.         pTexture.UnlockRect i
  208.     Next i
  209. Failed:
  210. End Sub
  211.  
  212.